package view;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridLayout;
import javax.swing.*;
import java.util.List;

import db.*;
import ctrl.Ctrl;
import java.util.ArrayList;
import java.util.Collections;

public class Gui extends JFrame implements ActionListener, Ui {

	final int WIN_W = 512+256;
	final int WIN_H = 256+128+64;
	private Ctrl ctrl;

	private JButton btnAddAine = new JButton("Lisää ainesosa");
	private JButton btnAddLasi = new JButton("Lisää lasi");
	private JButton btnAddMenetelmä = new JButton("Lisää menetelmä");
	private JButton btnDelDrinkki = new JButton("Poista drinkki");
	private JButton btnAddUpDrinkki = new JButton("Lisää/Päivitä drinkki");
	private JButton btnSearchDrinkki = new JButton("Etsi drinkki");
	private JComboBox cmbDrinkki = new JComboBox();
	private JComboBox cmbLasi = new JComboBox();
	private JComboBox cmbMenetelmä = new JComboBox();
	private JComboBox cmbMakeus = new JComboBox();
	private JComboBox cmbLämpö = new JComboBox();
	private JComboBox cmbAika = new JComboBox();
	private JLabel lblName = new JLabel("Nimi:", JLabel.RIGHT);
	private JLabel lblAine = new JLabel("Ainesosat:", JLabel.RIGHT);
	private JLabel lblAika = new JLabel("Aika:", JLabel.RIGHT);
	private JLabel lblMakeus = new JLabel("Makeus:", JLabel.RIGHT);
	private JLabel lblLasi = new JLabel("Lasi:", JLabel.RIGHT);
	private JLabel lblLämpö = new JLabel("Lämpötila:", JLabel.RIGHT);
	private JLabel lblMenetelmä = new JLabel("Menetelmä:", JLabel.RIGHT);
	private JLabel lblOhje = new JLabel("Ohje:", JLabel.LEFT);
	private JPanel pnlAddItem = new JPanel();
	private JPanel pnlConsole = new JPanel();
	private JPanel pnlDelDrinkki = new JPanel();
	private JPanel pnlDrinkki = new JPanel();
	private JPanel pnlDrinkkiBtn = new JPanel();
	private JPanel pnlOhjeDrinkki = new JPanel();
	private JPanel pnlInput = new JPanel();
	private JScrollPane sbrConsole = null;
	private JTextArea txtOhje = new JTextArea();
	private JTextArea txtConsole = new JTextArea("Welcome to JCOCKtail 1.0\n\n>",
	                                             WIN_H/19, (WIN_W-24)/18);
	private JTextField txtAddAine = new JTextField();
	private JTextField txtAddLasi = new JTextField();
	private JTextField txtAddMenetelmä = new JTextField();
	private JTextField txtName = new JTextField();
	private JTextField txtAine = new JTextField();

	public Gui() {

		btnAddAine.addActionListener(this);
		btnAddLasi.addActionListener(this);
		btnAddMenetelmä.addActionListener(this);
		btnDelDrinkki.addActionListener(this);
		btnAddUpDrinkki.addActionListener(this);
		btnSearchDrinkki.addActionListener(this);
		txtConsole.setLineWrap(true);
		txtConsole.setEditable(false);
		sbrConsole = new JScrollPane(txtConsole);
		sbrConsole.setVerticalScrollBarPolicy(
			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		txtOhje.setLineWrap(true);

		cmbDrinkki.addActionListener (new ActionListener () {
			public void actionPerformed(ActionEvent e) {
				if (cmbDrinkki.getSelectedItem() != null)
					populateSearchPanel(String.valueOf(
						cmbDrinkki.getSelectedItem()));
				}
		});

		//////////////////////////////////////////////////////////////
		// Add item panel
		//////////////////////////////////////////////////////////////
		pnlAddItem.setLayout(new GridLayout(3, 2));
		pnlAddItem.add(txtAddAine);
		pnlAddItem.add(btnAddAine);
		pnlAddItem.add(txtAddLasi);
		pnlAddItem.add(btnAddLasi);
		pnlAddItem.add(txtAddMenetelmä);
		pnlAddItem.add(btnAddMenetelmä);

		//////////////////////////////////////////////////////////////
		// Del Drinkki panel
		//////////////////////////////////////////////////////////////
		pnlDelDrinkki.add(cmbDrinkki);
		pnlDelDrinkki.add(btnDelDrinkki);

		//////////////////////////////////////////////////////////////
		// Drinkki panel
		//////////////////////////////////////////////////////////////
		pnlDrinkki.setLayout(new GridLayout(7, 2));
		pnlDrinkki.add(lblName);
		pnlDrinkki.add(txtName);
		pnlDrinkki.add(lblAine);
		pnlDrinkki.add(txtAine);
		pnlDrinkki.add(lblAika);
		pnlDrinkki.add(cmbAika);
		pnlDrinkki.add(lblMakeus);
		pnlDrinkki.add(cmbMakeus);
		pnlDrinkki.add(lblLasi);
		pnlDrinkki.add(cmbLasi);
		pnlDrinkki.add(lblLämpö);
		pnlDrinkki.add(cmbLämpö);
		pnlDrinkki.add(lblMenetelmä);
		pnlDrinkki.add(cmbMenetelmä);

		//////////////////////////////////////////////////////////////
		// Drink button panel
		//////////////////////////////////////////////////////////////
		pnlDrinkkiBtn.setLayout(new BoxLayout(pnlDrinkkiBtn,
		                                      BoxLayout.LINE_AXIS));
		pnlDrinkkiBtn.add(btnAddUpDrinkki);
		pnlDrinkkiBtn.add(btnSearchDrinkki);

		//////////////////////////////////////////////////////////////
		// Ohje panel
		//////////////////////////////////////////////////////////////
		pnlOhjeDrinkki.setLayout(new BoxLayout(pnlOhjeDrinkki,
		                                      BoxLayout.PAGE_AXIS));
		pnlOhjeDrinkki.add(lblOhje);
		pnlOhjeDrinkki.add(txtOhje);
		pnlOhjeDrinkki.add(pnlDrinkkiBtn);

		//////////////////////////////////////////////////////////////
		// Input panel
		//////////////////////////////////////////////////////////////
		pnlInput.setLayout(new BoxLayout(pnlInput,
		                                 BoxLayout.PAGE_AXIS));
		pnlInput.setPreferredSize(new Dimension(WIN_W/2, WIN_H));
		pnlInput.add(pnlAddItem);
		pnlInput.add(pnlDrinkki);
		pnlInput.add(pnlOhjeDrinkki);
		pnlInput.add(pnlDelDrinkki);

		//////////////////////////////////////////////////////////////
		// Console panel
		//////////////////////////////////////////////////////////////
		pnlConsole.add(sbrConsole);

		//////////////////////////////////////////////////////////////
		// Main panel
		//////////////////////////////////////////////////////////////
		setLayout(new GridLayout(1, 2));
		setSize(new Dimension(WIN_W, WIN_H));
		setTitle("Jcock");

		add(pnlInput);
		add(pnlConsole);
	}

	public void set(Ctrl c) { ctrl = c; }

	public void actionPerformed(ActionEvent e) {
		if (e.getSource().equals(btnSearchDrinkki)){
			String sn[] = txtName.getText().split(", ");
			String sa[] = txtAine.getText().split(", ");

			List<String> ls = ctrl.search(sn, sa, (String)cmbAika.
				getSelectedItem(), (String)cmbLasi.
				getSelectedItem(), (String)cmbLämpö.
				getSelectedItem(), (String)cmbMakeus.
				getSelectedItem(), (String)cmbMenetelmä.
				getSelectedItem());

			if (ls.isEmpty()) {
				 txtConsole.setText(txtConsole.getText() +
					"Yhtään hakua vastaavaa drinkkiä " +
					"ei löytynyt.\n>");
				return;
			}

			txtConsole.setText(txtConsole.getText() +
				"---------------------------------------\n\n");

			for (String s : ls)
				txtConsole.setText(txtConsole.getText() + s +
					"\n>");

			if (ls.size() == 1) {
				String s[] = ls.get(0).split("\n");
				cmbDrinkki.setSelectedItem(s[0]);
			}
		}
		else if (e.getSource().equals(btnAddAine)){
			boolean ok = ctrl.addAinesosa(txtAddAine.getText());

			txtConsole.setText(txtConsole.getText()+"Ainesosan "+
				txtAddAine.getText() + " lisääminen " +
				(ok ? "onnistui." : "ei onnistunut.") + "\n>");
		}
		else if (e.getSource().equals(btnAddLasi)){
			if (ctrl.addLasi(txtAddLasi.getText())) {
				txtConsole.setText(txtConsole.getText() +
					"Lasi " + txtAddLasi.getText() +
					" lisätty.\n>");
				populateLasiList();
			}
			else 
				txtConsole.setText(txtConsole.getText()+
					"Oho, nyt tuli virhe...\n>");
		}
		else if (e.getSource().equals(btnAddMenetelmä)){
			if (ctrl.addMenetelmä(txtAddMenetelmä.getText())) {
				txtConsole.setText(txtConsole.getText() +
					"Menetelmä " + txtAddMenetelmä.
					getText() + " lisätty.\n>");
				populateMenetelmäList();
			}
			else 
				txtConsole.setText(txtConsole.getText()+
					"Oho, nyt tuli virhe...\n>");
		}
		else if (e.getSource().equals(btnDelDrinkki)){
			String s = (String)cmbDrinkki.getSelectedItem();
			if (ctrl.removeDrinkki(s)) {
				txtConsole.setText(txtConsole.getText() +
					"Drinkki" + s + " poistettu\n>");
				populateDrinkkiList();
			}
			else 
				txtConsole.setText(txtConsole.getText()+
					"Oho, nyt tuli virhe...\n>");
		}
		else if (e.getSource().equals(btnAddUpDrinkki)){
			boolean ok = ctrl.addDrinkki(txtName.getText().
			             split(", "), txtAine.getText().
			             split(", "), (String)cmbAika.
			             getSelectedItem(), (String)cmbLasi.
			             getSelectedItem(), (String)cmbLämpö.
			             getSelectedItem(), (String)cmbMakeus.
			             getSelectedItem(), (String)cmbMenetelmä.
			             getSelectedItem(), txtOhje.getText());

			if (ok) {
				txtConsole.setText(txtConsole.getText() +
					"Drinkki " + txtName.getText() +
					" luotu/päivitetty.\n>");
				populateDrinkkiList();
			}
			else 
				txtConsole.setText(txtConsole.getText()+
					"Oho, nyt tuli virhe...\n>");
		}
	}

	public void init() {
		List<Ajankohta> lt = ctrl.listAjankohta();
		lt.add(0, new Ajankohta());
		for (Ajankohta x : lt)
			cmbAika.addItem(x.getKuvaus());

		populateDrinkkiList();
		populateLasiList();

		List<Lämpötila> lT = ctrl.listLämpötila();
		lT.add(0, new Lämpötila());
		for (Lämpötila x : lT)
			cmbLämpö.addItem(x.getKuvaus());

		List<Makeus> ls = ctrl.listMakeus();
		ls.add(0, new Makeus());
		for (Makeus x : ls)
			cmbMakeus.addItem(x.getKuvaus());

		populateMenetelmäList();

		validate();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		pack();
		setVisible(true);
	}

	private void populateDrinkkiList() {
		cmbDrinkki.removeAllItems();
		List<Drinkki> ld = ctrl.listDrinkki();
		List<String> ls = new ArrayList<String>();

		for (Drinkki x : ld)
			ls.add(x.getTehNimi());

		Collections.sort(ls);
		for (String s : ls)
			cmbDrinkki.addItem(s);
	}

	private void populateLasiList() {
		cmbLasi.removeAllItems();
		List<Lasi> lg = ctrl.listLasi();
		lg.add(0, new Lasi());
		for (Lasi x : lg)
			cmbLasi.addItem(x.getKuvaus());
	}

	private void populateMenetelmäList() {
		cmbMenetelmä.removeAllItems();
		List<Menetelmä> lm = ctrl.listMenetelmä();
		lm.add(0, new Menetelmä());
		for (Menetelmä x : lm)
			cmbMenetelmä.addItem(x.getKuvaus());
	}

	private void populateSearchPanel(String nimi) {
		String ss[] = ctrl.getDrinkValues(nimi);
		txtName.setText(ss[0]);
		txtAine.setText(ss[1]);
		cmbAika.setSelectedItem(ss[2]);
		cmbMakeus.setSelectedItem(ss[3]);
		cmbLasi.setSelectedItem(ss[4]);
		cmbLämpö.setSelectedItem(ss[5]);
		cmbMenetelmä.setSelectedItem(ss[6]);
		txtOhje.setText(ss[7]);
	}
}
